package com.qf.controller;

import com.qf.constant.CacheConstants;
import com.qf.feign.CacheFeign;
import com.qf.form.SmsInterfaceForm;
import com.qf.service.IntefaceService;
import com.qf.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 接收客户方的下行数据
 * /sms/interface
 *
 * @author lixu
 */
@RestController
@RequestMapping("/sms")
public class IntefaceController {


    @Autowired
    private CacheFeign cacheFeign;
    @Value("${ip-header}")
    private String[] ipHeaders;
    @Autowired
    private IntefaceService intefaceService;

    /**
     * 接收数据
     * | No.  | 字段名   | 名称       | 是否必填 | 数据类型 | 说明                                                         |
     * | ---- | -------- | ---------- | -------- | -------- | ------------------------------------------------------------ |
     * | 1    | clientID | 客户ID     | 是       | 字符型   | 由服务方提供                                                 |
     * | 2    | srcID    | 下行编号   | 否       | 长整形   | 默认为空，非空保证唯一不能重复                               |
     * | 3    | mobile   | 目的手机号 | 是       | 字符型   | 非空，多个号请用英文逗号隔开，最多100个号码，                |
     * | 4    | content  | 消息的内容 | 是       | 字符型   | 内容长度<=500字符，以utf-8的方式编码                         |
     * | 5    | pwd      | 密码       | 是       | 字符型   | 由服务方提供,格式：MD5(password)32位大写手动接收来自nignx中请求的ip地址格式： |
     * | 6    | ip       | ip地址     | 否       | 字符型   | ip地址, 用户没有直接携带的参数,需要自己手动获取              |
     */
    @PostMapping("/interface")
    public Object interfaceForm(SmsInterfaceForm smsInterfaceForm
            , HttpServletRequest request) {

        //关于客户数据的key
        String key = CacheConstants.CACHE_PREFIX_CLIENT + smsInterfaceForm.getClientID();
        Map user = cacheFeign.hMGet(key);
        //1:判断当前用户是否存在
        if (null == user || user.size() == 0) {
            return Result.error(101, "认证错：clientId错误");
        }
        //2:判断当前用户的密码是否正确
        Object p = user.get("pwd");
        String pwd = smsInterfaceForm.getPwd();
        if (StringUtils.isEmpty(pwd) || !pwd.equals(p)) {
            return Result.error(102, "密码错误");
        }
        //3:短信内容的长度
        String content = smsInterfaceForm.getContent();
        if (StringUtils.isEmpty(content) || content.length() > 500) {
            return Result.error(104, "消息长度错，为空或超长（目前定为500个字）");
        }
        //4:下行编号
        String srcID = smsInterfaceForm.getSrcID();
        if (StringUtils.isEmpty(srcID)) {
            return Result.error(106, "下行编号（srcID）错误");
        }
        //5:获取 有代理也可能没有代理
        String ip = getIP(request);//  192.168.200.150
        smsInterfaceForm.setIp(ip);
        //缓存中客户当初指定的IP是否一致   "127.0.0.1,192.168.200,130"
        String ipaddress = (String) user.get("ipaddress");
        boolean flag = false;
        if(!StringUtils.isEmpty(ipaddress)){
            String[] ips = ipaddress.split(",");
            for (String i : ips) {
                if(i.equals(ip)){
                    flag = true;
                    break;
                }
            }
        }
        if(!flag){ //ip在客户指定的IP中肯定 有一个是相同的
            return Result.error(103,"IP错误");
        }
        //6:手机号必须 格式必须
        String mobile = smsInterfaceForm.getMobile();
        if(StringUtils.isEmpty(mobile)){
            return Result.error(105,"手机号错误");
        }
        //6.1 手机号 , 拆分   校验手机号的格式    156777777777,1568888888888
        String[] m = mobile.split(",");
        //手机的正则表达式
        String regex = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
        List<String> errorPhone = new ArrayList<>();
        if(null != m && m.length > 0){
            for (String phone : m) {
                if(!phone.matches(regex)){
                    errorPhone.add(phone);
                }
            }
        }
        if(errorPhone.size() > 0){
            return Result.error(105,"手机号错误:"+ errorPhone.toString());
        }

        //7.发消息  （以手机号为单位） Service层
        intefaceService.submitInterfaceForm(smsInterfaceForm);
        //全部正确
        return Result.ok();

    }

    /**
     * 获取代理 或代理的IP
     *
     * @param request
     * @return
     */
    public String getIP(HttpServletRequest request) {
        for (String ipHeader : ipHeaders) {
            String ip = request.getHeader(ipHeader);
            if (!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) {
                //请求头中有IP
                return ip;
            }
        }
        //没有代理   0:0:0:0:0:0:1   ipv6的本机访问    127.0.0.1 ipv4的本机访问  同学访问  10.9.28.241:8081/..
        return request.getRemoteAddr();
    }
}
